home *** CD-ROM | disk | FTP | other *** search
- /*
- dshell v3
-
- 画面表示初期化等
- */
-
-
- #include "dsh.h"
- #define FKEY_COLOR 5
- #define TITLE_COLOR 1
-
- static void p_fpt_sub(int , int );
-
-
- /*
- テキスト/グラフィックパレットの設定/取得
- */
- int
- dpalet(int paletNo, int color)
- {
- switch (paletNo) {
- case -3:
- case -2:
- case -1:
- return TPALET(-paletNo, color);
- case 0:
- if (color >= 0) {
- ushort r, g, b;
-
- g = (ushort)color;
- b = (g >> 1) & 0x1f;
- r = (g >> 6) & 0x1f;
- g = (g >> 11);
- b = (b * 4) / 5;
- r = (r * 4) / 5;
- g = (g * 4) / 5;
- GPALET(15, (g << 11) | (r << 6) | (b << 1));
- }
- /* NOBREAK */
- default:
- return GPALET(paletNo, color);
- }
- }
-
- /*
- テキスト/グラフィック(GMODE=0 時のみ)パレット初期化
- */
- void initPalet(void)
- {
- vsync();
- TPALET(0, 0);
- TPALET(1, tx_col[1]);
- TPALET(2, (GMODE) ? 1 : tx_col[2]);
- TPALET(3, (GMODE) ? 0xffff : tx_col[3]);
- TPALET(4, -2);
- TPALET(8, -2);
-
- if (!GMODE) {
- int i;
- for (i = 0; i < 5; i++)
- dpalet(i, gr_col[i]);
- }
- }
-
- void
- resetBG(void)
- {
- ushort c = GPALET(0, -1);
- vsync();
- GPALET(0, c);
- GPALET(15, c);
- if (bgCut != NULL && bgCut->type >= 0)
- bgPutCut(bgCut, 15);
- else
- fill(0, 16, 767, 495, 0);
- }
-
-
- /*
- 画面初期化
- initScrnFlag: 画面モードの設定が必要かどうかのフラグ
- (set_g_mode 直後のみ FALSE を指定)
- */
- void
- din(int initScrnFlag)
- {
- int i;
- int mx, my;
-
- /* [穴]の位置 */
- static const char ox[][2] = {
- {2, 20}, /* 日時 */
- {81, 5}, /* child */
- {90, 4}, /* 終了 */
- {-1, -1}
- };
-
- OS_CUROF();
- mspos(&mx, &my);
- mouse(0);
- mouse(4);
- clr_kbf();
-
- getFont16(&defFont16);
-
- if (GMODE) {
- // B_PRINT("Dしばらくお待ちください");
- vsync();
- B_WPOKE(VIDEOR2, B_WPEEK(VIDEOR2) & 0xff9f);
- cls();
- g_push(FALSE);
- } else if (initScrnFlag) {
- vsync();
- B_WPOKE(VIDEOR2, 0);
- C_WIDTH(1);
- vsync();
- B_WPOKE(VIDEOR2, 0);
- if (bgCut != NULL && bgCut->type >= 0)
- bgPutCut(bgCut, 15);
- }
- B_CONSOL(0, 0, 128 - 1, 64 - 1);
- msarea(0, 0, GWIDTH - 1, 511);
- setmspos(mx, my);
-
- initPalet();
- setWidth();
-
- if (!(GMODE)) {
- fill(0, 0, 767, 15, 1); /* メニューバー上 */
- // fill(0, 16, 767, 495, 0); /* 主背景 */
-
- for (i = 0; ox[i][0] >= 0; i++) {
- fill(8 * ox[i][0], 1, 8 * (ox[i][0] + ox[i][1]) - 1, 14, 2);
- }
- }
-
- Init_Upper_Bar();
- Init_Under_Bar();
- B_COLOR(3);
-
- if (!GMODE && initScrnFlag) {
- vsync();
- B_WPOKE(VIDEOR2, 0x0030);
- }
- // mouse(1);
- }
-
- /*
-
- */
- void
- Init_Upper_Bar(void)
- {
- p_title(Titlename);
- if (!(GMODE)) {
- p_time(1);
- B_PUTMES(FKEY_COLOR, 80, 0, 14 - 1, "9Child 10終了");
- } else {
- B_PUTMES(FKEY_COLOR, 0, 0, 7 - 1, " 画像 ");
- g_mask(1, 0, "____");
- B_PUTMES(FKEY_COLOR, 47, 0, 17 - 1, " 9Child 10終了 ");
- g_mask(51, 0, "_____ ____");
- }
- }
-
- /*
- アンダーバーの初期化
- */
- void
- Init_Under_Bar(void)
- {
- int i;
- static const char ox[][2] = {
- {2, 4}, /* 頭末 */
- {9, 4}, /* 改頁 */
- {16, 4}, /* 改区 */
- {23, 4}, /* 改行 */
- {30, 3}, /* RGB */
- {35, 4}, /* MESH */
- {41, 4}, /* FIND */
- {47, 4}, /* LOAD */
- {53, 4}, /* 印刷 */
- {59, 4}, /* MENU */
- {82, 5}, /* bar */
- {90, 4}, /* 復帰 */
- {-1, -1}
- };
-
- if (!(GMODE)) {
- /* テキスト座標で与えられています↓ */
-
- fill(0, 496, 767, 511, 1); /* メニューバー下 */
-
- for (i = 0; ox[i][0] >= 0; i++) {
- fill(8 * ox[i][0], 497, 8 * (ox[i][0] + ox[i][1]) - 1, 510, 2);
- }
-
- /* ファンクションキーの番号を付けてあるのです */
- B_PUTMES(FKEY_COLOR, 0, 31, 96 - 1, " 1頭末2 3改頁4 5改区6 7改行8 RGB MESH FIND LOAD 印刷 MENU");
- } else {
- B_PUTMES(FKEY_COLOR, 0, 31, 64 - 1, " 1頭末2 3改頁4 5改区6 7改行8 印刷 MENU");
- g_mask(2, 31, "____ ____ ____ ____ _____ ____ ____ ____");
- }
- p_fpt(1);
- }
-
-
-
- /*
- 日付表示
- aflg:時間(秒)の変化がなくても強制再表示 のフラグ
- */
- void
- p_time(int aflg)
- {
- static olddate = 0, oldtime = 0;
- const char *youbi = "日月火水木金土";
- union {
- struct { /* GETDATE()用ビットフィールド */
- unsigned int :13;
- unsigned int w:3;
- unsigned int y:7; /* 1980からの相対年数 */
- unsigned int m:4;
- unsigned int d:5;
- } bit;
- unsigned int body;
- } dt;
- union {
- struct { /* GETTIM2()用ビットフィールド */
- #if 0
- unsigned int :11;
- unsigned int h:5;
- unsigned int :2;
- unsigned int m:6;
- unsigned int :2;
- unsigned int s:6;
- #else
- unsigned short h;
- unsigned char m;
- unsigned char s;
- #endif
- } bit;
- unsigned int body;
- } tm;
-
- B_LOCATE(0, 30); // for 電卓
- if (GMODE) {
- return;
- }
- tm.body = GETTIM2();
- if (tm.body != oldtime || aflg) {
- char buf[64];
-
- oldtime = tm.body;
- TIMEASC(tm.body, buf);
- B_PUTMES(TITLE_COLOR, 14, 0, 8 - 1, buf);
- if (tm.bit.s && !aflg) {
- return;
- }
- dt.body = GETDATE();
- if (dt.body != olddate || aflg) {
- olddate = dt.body;
- sprintf(buf, "%02d/%02d/%02d(%2.2s)",
- (dt.bit.y + 80) % 100, /* 「% 100」は為念(2000年以降でないと無意味) */
- dt.bit.m,
- dt.bit.d,
- youbi + dt.bit.w * 2);
- B_PUTMES(TITLE_COLOR, 2, 0, 12 - 1, buf);
- }
- }
- }
-
-
- /*
- 現在時刻部分の別表示
-
- 起動時間表示(左クリック)
-
- */
- void
- p_otm(void)
- {
- int dmx, dmy, bl, br;
- int day, tim;
- char buf[96];
-
- if (GMODE) {
- return;
- }
-
- B_PUTMES(TITLE_COLOR, 2, 0, 7 - 1, "OnTime:");
- do {
- asm("
- moveq #$7f,d0 * IOCS _ONTIME
- trap #15
- move.l d0,%0
- move.l d1,%1" : "=g"(tim), "=g"(day) : : "d0", "d1" );
-
- sprintf(buf, "%4d:%02d'%02d\"%02d",
- (day * 24 + tim / 100 / 60 / 60) % 10000, /* 4桁化 */
- tim / 100 / 60 % 60,
- tim / 100 % 60,
- tim % 100);
- B_PUTMES(TITLE_COLOR, 9, 0, 13 - 1, buf);
- dmsstat(&dmx, &dmy, &bl, &br);
- } while (bl);
-
- p_time(1);
- }
-
- /*
- */
- static size_t
- heapLeft(void)
- {
- void *p;
- int minSize = 0, maxSize = (_HEND - _HSTA);
- int n;
-
- while (minSize <= maxSize) {
- n = (minSize + maxSize) / 2;
- p = malloc(n);
- if (p == NULL) {
- maxSize = --n;
- } else {
- free(p);
- minSize = ++n;
- }
- }
- return --minSize;
- }
-
-
- /*
- 現在時刻部分の別表示
-
- フリーエリアサイズ(右クリック)
- */
- void
- p_freearea(void)
- {
- int dmx, dmy, mbl, mbr;
- size_t n;
- char buf[32];
-
- if (GMODE) {
- return;
- }
-
- n = chkml();
- if (debugMode) {
- ushort shiftKeys = (B_SFTSNS() & (SHIFT_KEY | OPT1_KEY | OPT2_KEY));
- if (shiftKeys == OPT1_KEY)
- n = heapLeft();
- else if (shiftKeys == OPT2_KEY)
- n = getSp() - _SSTA;
- }
- sprintf(buf, "%9d bytes Free", n);
- B_PUTMES(TITLE_COLOR, 2, 0, 20 - 1, buf);
- do {
- dmsstat(&dmx, &dmy, &mbl, &mbr);
- } while (mbr);
-
- p_time(1);
- }
-
- /*
- メインタイトル表示
- */
- void
- p_title(const uchar *str)
- {
- int sx = GMODE ? 6 : 27;
- int n, d;
-
- n = strlen(str);
- d = (42 - n) / 2; // 42は最大桁
- B_PUTMES(3, sx, 0, d - 1, "");
- B_PUTMES(5, sx + d, 0, 42 - d - 1, str);
- }
-
-
- /*
- 現バージョン表示
- */
- void
- p_ver(void)
- {
- p_title(Sysmes3);
- wait_mb_off();
- p_title(Titlename);
- }
-
-
- /*
- ファイル名表示
- */
- void
- p_file()
- {
- p_title(filename);
- wait_mb_off();
- p_title(Titlename);
- }
-
- /*
- 現在行数表示(数値・グラフィック)
- 0 = normal
- 1 = init
- 2 = for Realtime_Scroll()
- 3 = ~BAR~
- 4 = _BAR_
- */
- void
- p_fpt(int n)
- {
- int mx, my;
- static int olpmy = -1;
- char buf[96];
- static const short xl[3] =
- {82, 43, 43};
-
- switch (n) {
- case 0:
- p_fpt_sub(30, 0);
- break;
- case 1:
- if (!GMODE) {
- fill(528, 498, 639, 509, 3);
- }
- p_fpt_sub(30, 1);
- break;
- case 2:
- p_fpt_sub(Rwin_len, 0); /* Realtime_Scroll()と連動 */
- break;
- case 3:
- if (olpmy != -1) {
- B_PUTMES(TITLE_COLOR, xl[GMODE], 31, 5 - 1, "上bar");
- if (GMODE) {
- g_mask(xl[GMODE], 31, "_____");
- }
- }
- olpmy = -1; /* dummy */
- return;
- case 4:
- if (olpmy != -2) {
- B_PUTMES(TITLE_COLOR, xl[GMODE], 31, 5 - 1, "下bar");
- if (GMODE) {
- g_mask(xl[GMODE], 31, "_____");
- }
- }
- olpmy = -2; /* dummy */
- return;
- default:
- return;
- }
-
- dmspos(&mx, &my);
- my /= 16;
- if (my > 30) {
- my = 1;
- }
- if (n == 1 || olpmy != lp + my) {
- olpmy = lp + my;
- sprintf(buf, "%5d", olpmy);
- B_PUTMES(TITLE_COLOR, xl[GMODE], 31, 5 - 1, buf);
- if (GMODE) {
- g_mask(xl[GMODE], 31, "_____");
- }
- }
- }
-
-
- static void
- p_fpt_sub(int lin, int init_flg)
- {
- static int olp, olpmx, olin;
-
- if (GMODE) {
- return;
- }
-
- if (olp == lp && olin == lin && olpmx == lpmx && !init_flg) {
- return;
- }
- fill(528, 498, 639, 509, 3);
- if (lpmx > 0) {
- #define BAR_WIDTH 112
- int x0, x1;
-
- if (lpmx > 30) {
- x0 = (BAR_WIDTH * lp) / lpmx;
- x1 = (BAR_WIDTH * (lp + lin) + lpmx / 2) / lpmx;
- } else {
- int d = lp + 30;
- x0 = (BAR_WIDTH * lp) / d;
- x1 = (BAR_WIDTH * (lp + lin) + d / 2) / d;
- }
- if (x1 - x0 < 3)
- x1 = x0 + 3;
- if (x1 > BAR_WIDTH) {
- x0 -= x1 - BAR_WIDTH;
- if (x0 < 0)
- x0 = 0;
- x1 = BAR_WIDTH;
- }
- fill(528 + x0, 498, 528 + x1 - 1, 509, 4);
- }
- olp = lp;
- olin = lin;
- olpmx = lpmx;
- }
-
-
- /*
- 復帰(反転)表示
- */
- void
- p_fukki(void)
- {
- if (GMODE) {
- B_PUTMES((nest) ? FKEY_COLOR : 0, 59, 31, 4 - 1, "復帰");
- g_mask(59, 31, "____");
- } else {
- B_PUTMES((nest) ? FKEY_COLOR : 2, 90, 31, 4 - 1, "復帰");
- }
- }
-
- /*
- 画面モードを復帰
- */
- void
- dout()
- {
- int i;
- int mx, my;
-
- mouse(2);
- B_COLOR(3);
- if (!GMODE) {
- vsync();
- B_WPOKE(VIDEOR2, 0);
- C_WIDTH(0);
- }
- vsync();
- cls();
- for (i = 0; i <= 4; i++) {
- TPALET(i, -2);
- }
- TPALET(8, -2);
- mspos(&mx, &my);
- mouse(0);
- setmspos(mx, my);
- clr_kbf();
- OS_CURON();
- }
-
-
- void
- use_fnk()
- {
- C_FNKMOD(3);
- C_WINDOW(0, 32);
- }
-
-
- void
- nouse_fnk()
- {
- C_FNKMOD(0);
- C_WINDOW(0, 31);
- }
-
-
- void
- setWidth(void)
- {
- static const char widthTable[] = { 96, 64, 64, };
-
- CWIDTH = widthTable[GMODE];
- GWIDTH = CWIDTH << 3;
- }
-
- void
- initKeyBuffer(void)
- {
- // ソフトウェアキーボード対策... (全キーをキーOFF)
- asm("
- moveq.l #$ff,d1
- @@: moveq.l #5,d0
- trap #15
- subq.b #1,d1
- bmi @b
- " : : : "d0", "d1");
- clr_kbf();
- }
-